识别-理解-分发语音指令
机器人具备“跳舞”、“唱歌”、“导航”等技能,用户可以通过向机器人发出语音指令触发机器人对应的技能。比如:用户说“跳个舞吧”,机器人便会开始跳舞。用户发出指令到机器人执行指令,机器人工作步骤如下:
- 识别:机器人“听出”有用户在对自己说话,并“听出”用户对其说了什么;
- 理解:听懂用户所说话的含义,并转换成对应的指令;
- 分发指令:将指令通过一定的途径分发出去;
- 执行指令。
以上步骤代码实现如下:
准备工作
准备工作包括搭建开发环境、创建项目、添加库依赖等,详情请见开发你的第一个机器人应用。
识别
开启机器人“听”的技能,可利用语音识别或语音唤醒技术。使用语音识别或语音唤醒技术均需通过语音服务访问代理对象 SpeechManager 提供的 API。 SpeechManager 对象创建请见语音服务。
识别过程使用的 API 均来自语音服务,此实现过程出现的参数、接口、专有名称等详细信息,均可通过语音服务查阅到,以下将不再赘述。
利用语音识别技术,使用机器人“听”的技能,可通过以下代码实现。
speechManager.recognize(new RecognitionOption.Builder( RecognitionOption.MODE_CONTINUOUS).build()) .progress(new ProgressCallback<RecognitionProgress>() { @Override public void onProgress(RecognitionProgress recognitionProgress) { if (recognitionProgress.getProgress() .equals(RecognitionProgress.PROGRESS_RECOGNITION_TEXT_RESULT)) { String asr = recognitionProgress.getTextResult(); understand(asr); // 执行“理解”操作 } } }) .fail(new FailCallback<RecognitionException>() { @Override public void onFail(RecognitionException e) { // “听” 出错会运行至此 } });
利用语音唤醒技术,使用机器人“听”的技能,可通过以下代码实现。
speechManager.registerWakeUpListener(new WakeUpListener() { @Override public void onWakingUp(WakeUp wakeUp) { // 机器人感知到被唤醒可进行如下工作:调整姿势(面向用户)、开启识别 // 开启识别 speechManager.recognize(new RecognitionOption.Builder( RecognitionOption.MODE_SINGLE).build()) .done(new DoneCallback<RecognitionResult>() { @Override public void onDone(RecognitionResult recognitionResult) { if (!recognitionResult.withUnderstandingResult()) { String inputText = recognitionResult.getText(); understand(inputText); // 执行“理解”操作 } } }) .fail(new FailCallback<RecognitionException>() { @Override public void onFail(RecognitionException e) { // “听” 出错会运行至此 } }); } });
若机器人“听”技能处于关闭状态,只利用语音识别技术,需要用户通过非语音的方式(点击按钮)才能开启该技能。如果使用语音唤醒技术,则用户可通过语音的方式(唤醒词)开启听的技能。
理解
机器人要想听懂用户说什么,可利用自然语言处理技术,代码实现如下。
public Promise<UnderstandingResult, UnderstandingException> understand(String inputText) { return speechManager.understand(inputText) .done(new DoneCallback<UnderstandingResult>() { @Override public void onDone(UnderstandingResult understandingResult) { String action = understandingResult.getIntent().getAction(); dispatchDirective(action); // 执行分发指令操作 } }).fail(new FailCallback<UnderstandingException>() { @Override public void onFail(UnderstandingException e) { // 理解出错会运行至此 } }); }
分发指令
public Promise<Void, DispatchException> dispatchDirective(String action) { return Robot.globalContext().dispatchDirective(action).done(new DoneCallback<Void>() { @Override public void onDone(Void aVoid) { // “分发指令” 完成将运行至此 } }).fail(new FailCallback<DispatchException>() { @Override public void onFail(DispatchException e) { // “分发指令”出错将运行至此 } }); }
执行指令
执行指令的应用称为技能应用,主要用于接收指令,接收到指令后,通过调用对应的系统服务即可执行指令。技能应用与分发指令的应用可以是同一个应用,也可以是不同应用,若是不同应用,则需创建,创建应用请参考开发你的第一个机器人应用,关于技能的实现请参考技能。